﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using OpenTK.Graphics.OpenGL;
using System.Runtime.InteropServices;
public unsafe class Rectangulo : IEntidad
{

    float[] arrCuadrado;
    float[] arrCuadrado2;

    public Rectangulo(Coordenada objLocalizacion, float pintLargo, float pintAlto)
    {

        arrCuadrado = new float[9];
        arrCuadrado2 = new float[9];
        this._localizacion = objLocalizacion;
        this._largo = pintLargo;
        this._alto = pintAlto;
        this.relocalizarCuadrado();
        this.Visible = true;
    }

    public Rectangulo()
    {
        arrCuadrado = new float[9];
        arrCuadrado2 = new float[9];
        this._localizacion = new Coordenada();
        this.Visible = true;
    }

    //propiedades
    private Colores _coloreadoBorde;
    public Colores ColoreadoBorde
    {
        get { return _coloreadoBorde; }
        set { _coloreadoBorde = value; }
    }

    private Estilo.Borde _tipoBorde;
    public Estilo.Borde TipoBorde
    {
        get { return this._tipoBorde; }
        set { this._tipoBorde = value; }
    }

    private Estilo.Forma _tipoForma;
    public Estilo.Forma TipoForma
    {
        get { return this._tipoForma; }
        set { this._tipoForma = value; }
    }

    private bool _visible;
    public bool Visible
    {
        get { return _visible; }
        set { _visible = value; }
    }

    private string _tabla;
    public string Tabla
    {
        get { return _tabla; }
        set { _tabla = value; }
    }

    private Coordenada _localizacion;
    public Coordenada Localizacion
    {
        get { return _localizacion; }
        set { 
            _localizacion = value;
            relocalizarCuadrado();
        }
    }

    protected void relocalizarCuadrado()
    {
        //primer triangulo
        arrCuadrado[0] = _localizacion.X - (this.Largo/2.0f);
        arrCuadrado[1] = _localizacion.Y - (this.Alto / 2.0f);
        arrCuadrado[2] = _localizacion.Z;
        arrCuadrado[3] = _localizacion.X - (this.Largo/2.0f);
        arrCuadrado[4] = _localizacion.Y + (this.Alto / 2.0f);
        arrCuadrado[5] = _localizacion.Z;
        arrCuadrado[6] = _localizacion.X + (this.Largo / 2.0f);
        arrCuadrado[7] = _localizacion.Y + (this.Alto / 2.0f);
        arrCuadrado[8] = _localizacion.Z;
        //segundo triangulo
        arrCuadrado2[0] = _localizacion.X - (this.Largo / 2.0f);
        arrCuadrado2[1] = _localizacion.Y - (this.Alto / 2.0f);
        arrCuadrado2[2] = _localizacion.Z;
        arrCuadrado2[3] = _localizacion.X + (this.Largo / 2.0f);
        arrCuadrado2[4] = _localizacion.Y + (this.Alto / 2.0f);
        arrCuadrado2[5] = _localizacion.Z;
        arrCuadrado2[6] = _localizacion.X + (this.Largo / 2.0f);
        arrCuadrado2[7] = _localizacion.Y - (this.Alto / 2.0f);
        arrCuadrado2[8] = _localizacion.Z;
    }

    private Colores _coloreado;
    public Colores Coloreado
    {
        get { return _coloreado; }
        set { _coloreado = value; }
    }

    /*private OglMatriz _matriz;
    public OglMatriz MatrizOGL
    {
        get { return _matriz; }
        set { _matriz = value; }
    }*/

    private float _largo;
    public float Largo
    {
        get { return _largo; }
        set {
            _largo = value;
            relocalizarCuadrado();
        }
    }

    private float _alto;
    public float Alto
    {
        get { return _alto; }
        set { 
            _alto = value;
            relocalizarCuadrado();
        }
    }

    public void setParams(float pLargo, float pAlto, Coordenada pCoordenada)
    {
        this._largo = pLargo;
        this._alto = pAlto;
        this._localizacion = pCoordenada;
        relocalizarCuadrado();
    }

    public unsafe void _pintar()
    {
        fixed (float* apuntapunto = &arrCuadrado[0], apuntapunto2 = &arrCuadrado2[0])
        {
            if (this.Visible)
            {
                GL.EnableClientState(ArrayCap.ColorArray);
                if (this.CapaCanvas == null)
                {
                    GL.ColorPointer(4,ColorPointerType.Float, 0, (IntPtr)this.Coloreado.ArregloColores());
                    //GL.Color4f(this.Coloreado.Rojo, this.Coloreado.Verde, this.Coloreado.Azul, this.Coloreado.Alfa);
                }
                GL.EnableClientState(ArrayCap.VertexArray);
                GL.VertexPointer(3, VertexPointerType.Float, 0, (IntPtr)apuntapunto);
                GL.DrawArrays(BeginMode.Triangles, 0, 3);
                GL.VertexPointer(3, VertexPointerType.Float, 0, (IntPtr)apuntapunto2);
                GL.DrawArrays(BeginMode.Triangles, 0, 3);
                GL.DisableClientState(ArrayCap.VertexArray);
                GL.DisableClientState(ArrayCap.ColorArray);
                GL.Flush();
            }
        }
    }

    private float _grosor;
    public float Grosor
    {
        get { return _grosor; }
        set { _grosor = value; }
    }

    private string _id;
    public string ID
    {
        get { return _id; }
        set { _id = value; }
    }

    private Capa _capa;
    public Capa CapaCanvas
    {
        get { return _capa; }
        set { _capa = value; }
    }
}
